;##################################
;命令：
;nasm -f elf64 day30_1trans_2vshufps.asm -o main.o && gcc main.o -o main -lc -no-pie && ./main
;输出：
;Value in arr[0] is 0.000000.
;Value in arr[1] is 3.333300.
;Value in arr[2] is 7.777700.
;Value in arr[3] is 8.888800.
;##################################
extern printf

section .data
	msg: db `Value in arr[%d] is %f.\n`, 0
	arr: dd 0.0000, 1.1111, 2.2222, 3.3333, 4.4444, 5.5555, 6.6666, 7.7777, 8.8888, 9.9999, 10.0000, 11.1111, 12.2222, 13.3333, 14.4444, 15.5555

section .text
	global main

main:
	push rbp
	mov rbp, rsp

;####################################################################################
	vmovups xmm0, [arr]
	vmovups xmm1, [arr + 4 * 6]
	;load a[0] a[1] a[2] a[3]
	;load a[6] a[7] a[8] a[9]
	;vshufps指令会从第一个向量拿两个数，再从第二个向量拿两个数
	;拿a[0] a[3] a[7] a[8]
	;其中a[0] a[1] a[2] a[3]四个位置分别对应00 01 10 11
	;a[0]对应00，a[3]对应11
	;其中a[6] a[7] a[8] a[9]四个位置分别对应00 01 10 11
	;a[7]对应01，a[8]对应10
	;a[0] a[3] a[7] a[8]对应00 11 01 10
	;将每两个数逆序写出10 01 11 00，逆序写出是指令定义
	;写成二进制形式10011100b
	vshufps xmm0, xmm1, 10011100b
	vmovups [arr], xmm0
;####################################################################################

	;打印
	mov ebx, 0
	jmp compare

execute:
	mov rdi, msg
	movsxd rsi, ebx
	cvtss2sd xmm0, dword [arr + 4 * ebx]
	movq rdx, xmm0
	call printf

	inc ebx

compare:
	cmp ebx, 4
	jl execute

	mov eax, 0
	leave
	ret
